package icu.lookyousmileface.netty.simple;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import io.netty.util.CharsetUtil;

import javax.xml.stream.events.Characters;
import java.io.Serializable;
import java.nio.charset.Charset;

/**
 * @author shenj
 * @title: NettyHandler
 * @projectName NettyPro
 * @date 2020/12/3 19:50
 * 注意：要指定自己的Handler就需要继承netty规定好的某个HandlerAdapter（规范）
 * 此时的Handler才能称之为一个Handler
 */
public class NettyHandler extends ChannelInboundHandlerAdapter implements Serializable {
    /**
     * @author shenj
     * @title: channelRead
     * @date 2020/12/3  19:54
     * 1、ChannelHandlerContext:上下文对象，包含pipeline（管道）、channel、地址
     * msg:指的是客户端发送的数据，默认Object对象
     */
    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        System.out.println("Server ctx:"+ctx);
        //ByteBuf是netty特有的Buffer性能比NIO的ByteBuffer更好
        ByteBuf dataBuf = (ByteBuf) msg;
        System.out.println("客户端发送来的消息是："+dataBuf.toString(CharsetUtil.UTF_8));
        System.out.println("客户端的地址是："+ctx.channel().remoteAddress());
    }
    /**
     * @author shenj
     * @title: channelReadComplete
     * @date 2020/12/4  1:12
     *  channelRead数据读取完毕的操作
     */
    @Override
    public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
        //writeAndFlush=write+Flush，写入缓冲区并且刷新，使用write只是写到缓冲区
        //非池化的Unpooled，Unpooled.copiedBuffer拷贝到buffer区指定字符集
        ctx.writeAndFlush(Unpooled.copiedBuffer("Hello,客户端~",CharsetUtil.UTF_8));
    }
    /**
     * @author shenj
     * @title: exceptionCaught
     * @date 2020/12/4  1:18
     * 处理异常，一般关闭通道
     */
    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
        ctx.close();
    }
}
